package com.qianfeng.openplatform.sercice;

import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@Service
public interface CacheService {
    /**
     * 缓存字符串
     * @param key 键
     * @param value 值
     * @param l 生存时间 如果传入null 表示永久生存, 单位是毫秒 ms
     * @return
     * @throws Exception
     */
    boolean cacheStrSet(String key, String value, Long l) throws Exception;

    /**
     * 保存数据到 redis
     * @param key
     * @param value
     * @param expireTime
     * @return
     * @throws Exception
     */
    boolean save2Redis(String key, String value, Long expireTime) throws Exception;

    /**
     * 从 redis 中获取数据
     * @param key
     * @return
     * @throws Exception
     */
    String getFromRedis(String key) throws Exception;

    /**
     * 删除一个 key
     * @param key
     * @return
     * @throws Exception
     */
    boolean deleteKey(String key) throws Exception;

    /**
     * 给指定的 key 设置过期时间
     * @param key
     * @param expireTime
     * @return
     * @throws Exception
     */
    boolean expire(String key, long expireTime) throws Exception;

    /**
     * 获取自增 id
     * @param key
     * @return
     * @throws Exception
     */
    Long getAutoIncrementId(String key) throws Exception;

    /**
     * 获取指定 key的 set 集合
     * @param key
     * @return
     * @throws Exception
     */
    Set<Object> sMembers(String key) throws Exception;

    /**
     * 向 set 中添加数据
     * @param key
     * @param value
     * @param expireTime
     * @return
     * @throws Exception
     */
    Long sAdd(String key, String value, Long expireTime) throws Exception;

    /**
     * 批量向 set 中添加数据
     * @param key
     * @param value
     * @param expireTime
     * @return
     * @throws Exception
     */
    Long sAdd(String key, String[] value, Long expireTime) throws Exception;

    /**
     * 删除指定数据
     * @param key
     * @param value
     * @return
     * @throws Exception
     */
    Long sRemove(String key, String value) throws Exception ;

    /**
     * 向hash中存放某个数据
     * @param key
     * @param field
     * @param value
     * @throws Exception
     */

    void hSet(String key, String field, String value) throws Exception;

    /**
     * 从hash中获取指定field的数据
     * @param key
     * @param field
     * @return
     * @throws Exception
     */
    String hGet(String key, String field) throws Exception;

    /**
     * 获取 hash 中所有的数据
     * @param key
     * @return
     * @throws Exception
     */
    Map<Object, Object> hGetAll(String key) throws Exception;


    /**
     * setnx操作
     * @param key
     * @param value
     * @param expireSecond
     * @return
     * @throws Exception
     */
    boolean setNX(String key, String value, long expireSecond) throws Exception;

    /**
     * 批量添加
     * @param key
     * @param map
     * @return
     * @throws Exception
     */
    boolean hMset(String key, Map<Object, Object> map) throws Exception;

    /**
     * 查找符合表达式的 key
     * @param partten
     * @return
     * @throws Exception
     */
    Set<String> findKeyByPartten(String partten) throws Exception;

    /**
     * redis中hash数据的自增操作
     * @param key
     * @param field
     * @param delta 自增步长
     * @return
     * @throws Exception
     */
    Long hIncrement(String key, String field, long delta) throws Exception;
}
